#include "KamaCoder.h"
using namespace std;

// 存在一种情况：图中可能出现负权回路
int KamaCoder97::run() {
  int n, m, p1, p2, val;
  cin >> n >> m;

  // 定义的三维dp数组
  vector<vector<vector<int>>> grid(
      n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, MAX_INT)));
  // dp[i][j][k]表示  从i到j 经过 1-k节点的 最短距离

  for (int i = 0; i < m; i++) {
    cin >> p1 >> p2 >> val;
    grid[p1][p2][0] = val;
    grid[p2][p1][0] = val;
  }

  // 三层循环，先求经过k, 已层级进行计算，每一层的i->j的最短距离
  for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++) {
      for (int j = i; j <= n; j++) {
        // grid[i][j][k-1] 为不经过 节点k
        //  grid[i][k][k-1] + grid[k][j][k-1] 经过节点 k
        grid[i][j][k] =
            min(grid[i][j][k - 1], grid[i][k][k - 1] + grid[k][j][k - 1]);
      }
    }
  }

  // 输出结果
  int z, start, end;
  cin >> z;
  while (z--) {
    cin >> start >> end;
    if (grid[start][end][n] == MAX_INT)
      cout << -1 << endl;
    else {
      cout << grid[start][end][n] << endl;
    }
  }

  return 0;
}

// 存在一种情况：图中可能出现负权回路
int KamaCoder97::run2() {
  int n, m, p1, p2, val;
  cin >> n >> m;

  // 定义dp数组
  vector<vector<int>> grid(n + 1, vector<int>(n + 1, MAX_INT));
  // dp[i][j]表示  从i到j的 最短距离

  // 输入数据，也是在初始化矩阵
  for (int i = 0; i < m; i++) {
    cin >> p1 >> p2 >> val;
    grid[p1][p2] = val;
    grid[p2][p1] = val;
  }

  // 三层循环，先求经过k, 已层级进行计算，每一层的i->j的最短距离

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      // 遍历经过其他节点
      for (int k = 1; k <= n; k++) {
        if (k == i || k == j) continue;
        // grid[i][j][k-1] 为不经过 节点k
        // grid[i][k][k-1] + grid[k][j][k-1] 经过节点 k
        grid[i][j] = min(grid[i][j], grid[i][k] + grid[k][j]);
      }
    }
  }

  // 输出结果
  int z, start, end;
  cin >> z;
  while (z--) {
    cin >> start >> end;
    if (grid[start][end] == MAX_INT)
      cout << -1 << endl;
    else {
      cout << grid[start][end] << endl;
    }
  }

  return 0;
}